<template>
  <el-main>
    <el-card shadow="never" header="定位SQL错误位置">
      <el-row>
        <div ref="editorContainerRef" style="width: 100%; height: 500px"></div>
      </el-row>
      <!-- <el-row>
        <el-input v-model="showContent" type="textarea" :rows="5"></el-input>
      </el-row> -->
      <el-row>
        <el-input-number v-model="pos"></el-input-number>
      </el-row>
      <el-row>
        <el-button @click="handleClick"></el-button>
      </el-row>
      <!-- <el-row>
        <span>
          {{ sql.substring(0, pos) }}
          <span style="color: red">
            {{ sql.substring(pos, pos + 1) }}
          </span>
          {{ sql.substring(pos + 1) }}
        </span>
      </el-row> -->
    </el-card>
  </el-main>
</template>

<script setup>
import { ref, onMounted, watch, onBeforeUnmount, toRaw, useTemplateRef } from 'vue'
import prettier from 'prettier/standalone'
import prettierSql from 'prettier-plugin-sql'
import loader from '@monaco-editor/loader'
import * as monaco from 'monaco-editor'
// loader.config({ monaco })
loader.config({ monaco, 'vs/nls': { availableLanguages: { '*': 'zh-cn' } } })
// import 'monaco-editor/esm/vs/editor/editor.all.js'
// import * as monaco from 'monaco-editor/esm/vs/editor/editor.api'
// import 'monaco-editor/esm/vs/basic-languages/sql/sql.contribution'
const editorContainer = useTemplateRef('editorContainerRef') // 绑定容器元素节点
const editorInstance = ref(null)

const showContent = ref(`--********************************************************************--
--Author:
--CreateTime: 2025-10-04 14:26:51
--Comment: 请输入业务注释信息
--业务逻辑：
--1、单位账户状态 等于 01-正常的 单位性质 等于 G 国企业的？
--2、缴至年月为空的不传
--3、组织机构代码不为 18位的 zzjgdm置为空； dmlx 不为 0 的zzjgdm置为空
--位图计算，要计算最近2年的指标要先获取最近3年的位图，反转后因为最近没有缴存，会丢失0 ，补F，然后后面做位移的时候+4
-- 用12-当前月+1 就是需要截取的起始位置。需要在把补的F那4位补上
--********************************************************************--
WITH tem_dp0001 AS (
    SELECT
        DWKHH,--单位客户号
            (CASE
            WHEN (length(ZZJGDM) = 18 AND DMLX = '0')
            THEN ZZJGDM
            ELSE ''
        END ) AS ZZJGDM, --组织机构代码
        DWMC, --组织机构名称
        DWFXR --单位发薪日
    FROM
        ods.ods_cz_dlrundb_dp0001_ddf
    WHERE
        DWXZ in ('30', '31', '32', '33', '39') --30-国有企业,31-城镇集体企业,32-外商投资企业,33-城镇私营企业,39-其他城镇企业
        AND dt = '\${#date(0,0,-1):yyyyMMdd#}'
),
tem_dp0004 AS (
    SELECT
        DWZH,     ---单位账号
        DWKHH,    ---单位客户号
        JZNY,     --缴至年月
        DWWT,     --单位位图
        YHJJE    --月汇缴金额
    FROM
        ods.ods_cz_dlrundb_dp0004_ddf
    WHERE
        dt = '\${#date(0,0,-1):yyyyMMdd#}'
        and  DWZHZT = '01' --单位账户状态 01-正常
),
tem_dp0004_dwwt AS (
    SELECT
        a.DWZH,     --单位账号
        max(a.j2nzcjfcs) as j2nzcjfcs, --近两年正常缴费次数
        max(LENGTH(tv.tvc)) as j2nlxzcjnzq --近两年连续正常缴纳周期(原来的代码是取的连续最长)
    FROM (
        SELECT
            DWZH,     --单位账号
            DWWT,     --单位位图
            length(regexp_replace(concat('0',substr(conv(CONCAT('F',substr(reverse(dwwt),1,9)),16,2),4+(12-MONTH(CURRENT_DATE))+1,24)),'0','')) as j2nzcjfcs --近两年正常缴费次数
        FROM
           tem_dp0004
        ) a
        lateral view  explode(split(regexp_replace(concat('0',substr(conv(CONCAT('F',substr(reverse(dwwt),1,9)),16,2),4+(12-MONTH(CURRENT_DATE))+1,24)),'0+','0'),'0')) tv as tvc  --近两年连续正常缴纳周期(原来的代码是取的连续最长)
        group by DWZH
),
tem_dp0007 AS (
    SELECT
        a.DWZH, --单位账号
        a.QSNY, --记账日期
        a.FSRS, --发生人数
        a.FSE --发生额
    FROM(
        SELECT
            DWZH,QSNY,FSRS,FSE,JYLX,GJJZY, ROW_NUMBER() OVER (PARTITION BY DWZH,QSNY ORDER BY dt DESC) as rn
        FROM
            ods.ods_cz_dlrundb_dp0007_ddi
        WHERE
            JYLX ='0' --0-正常,7-当日冲正,8-冲账
            AND GJJZY ='1001' --1001-汇缴,1002:补缴
            AND QSNY >= '\${#date(0,-24,0):yyyyMM#}' AND  JSNY<'\${#date(0,0,0):yyyyMM#}'
            and dt BETWEEN '\${#date(0,-24,0):yyyyMM01#}' AND '\${#date(0,0,-1):yyyyMMdd#}'
        ) a --最近2年
    WHERE
        a.rn=1
    ORDER BY
        a.DWZH,a.QSNY
    ),
tem_dp0007_calc AS (
    SELECT
        DWZH,
        concat_ws('_', collect_list(concat_ws(',', QSNY, cast(FSRS AS string)))) as FSRS,
        concat_ws('_', collect_list(concat_ws(',', QSNY, cast(FSE AS string)))) as FSE
        FROM
            tem_dp0007
        GROUP BY DWZH
),
--计算每个单位的 期限:单位发薪日+5 和 欠缴月份数
-- 标记出在当前时间点真正“欠缴”的单位，只计算欠缴金额，金额大于0 再生成SFQJ-是否欠缴
-- 欠缴判断逻辑
-- 差距月数 = 0 的说明当前年月和缴至年月在同一个月份。--不欠
-- 差距月数 = 1 的，缴纳到上个月，判断当前日期是否超过了宽限期，不超过不欠缴，超过了 欠缴，欠缴周期=1
-- 差距月数 >= 2 的,欠缴。判断当前日期是否超过了宽限期，不超过，欠缴周期=差距月数-1，超过了 欠缴周期=差距月数
-- 计算本次欠缴金额
tmp_dw_qjje AS (
 SELECT
     dwzh,
    CASE
        WHEN (arrear_months = '1' and cur_date>deadline_date)
        THEN arrear_months * yhjje
        WHEN (arrear_months >='2')
        THEN CASE
            WHEN cur_date>deadline_date
            THEN arrear_months * yhjje
            ELSE (arrear_months - '1') * yhjje
            END
        ELSE 0.0
        END AS qjje
    FROM(
        SELECT
            b.DWZH,           -- 单位账号
            b.YHJJE,          -- 月汇缴额
            -- 计算欠缴月数 (当前年月 - 最后汇缴年月)
            -- 使用 months_between 函数 计算缴存年月与当前年月1号直接的差距。先用jzny判断差多少个月。
            months_between(to_date('\${#date(0,0,0):yyyy-MM-01#}'),to_date(concat(b.JZNY, '-01'))) AS arrear_months,

            -- 计算期限 (发薪日 + 5个工作日) 2025-10-15
            date_add(to_date(concat('\${#date(0,0,0):yyyy-MM-#}', a.DWFXR)), 5) AS deadline_date,

             -- 当前日期
            to_date('\${#date(0,0,0):yyyy-MM-dd#}') AS cur_date

            FROM
                tem_dp0001 a, tem_dp0004 b
            where
                b.JZNY !='' and a.dwkhh = b.dwkhh) a
)

--INSERT OVERWRITE TABLE ads.ads_ssjjsb_zfgjjxxxyzxzyxlsx_mmf PARTITION(dt='\${#date(0,0,0):yyyyMM#}')
SELECT
    row_number() over(order by tem_dp0004.DWZH) AS ID,  --主键
    CURRENT_TIMESTAMP() ZHGXSJC,  --最后更新时间
    '0' as STATUS,  --状态
    tem_dp0004.DWZH as DWZH,  --单位账号
    tem_dp0001.ZZJGDM as ZZJGDM,  --组织机构代码
    tem_dp0001.DWMC as DWMC,  --单位名称
    tem_dp0007_calc.FSRS as FSRS,  --近两年每月缴存人数
    tem_dp0007_calc.FSE as FSE,  --近两年每月缴存额
    tem_dp0004_dwwt.j2nlxzcjnzq as j2nlxzcjnzq,  --近两年连续正常缴纳周期-(取的最大不是最近)
    tem_dp0004.JZNY as JZNY,  --缴至年月
    (case when tmp_dw_qjje.qjje>0 then '1' else '0' end) as sfqj,  --是否欠缴
    tmp_dw_qjje.qjje as QJJE,  --欠缴金额
    tem_dp0004_dwwt.j2nzcjfcs as j2nzcjfcs  --近两年正常缴费次数
FROM
    tem_dp0004, tem_dp0001,tem_dp0007_calc,tem_dp0004_dwwt,tmp_dw_qjje
where
    tem_dp0001.DWKHH = tem_dp0004.DWKHH
    and tem_dp0004.DWZH=tem_dp0007_calc.DWZH
    and tem_dp0004.DWZH=tem_dp0004_dwwt.DWZH
    and tmp_dw_qjje.DWZH=tem_dp0004.DWZH;`)
// const language = ref('sql')
// const languageMap = {
//   sql: 'sql',
//   ts: 'typescript'
//   // 其他语言映射...
// }

// const oldValue = toRaw(editorInstance.value).getValue();

// toRaw(editorInstance.value).setValue(oldValue + newValue);

// toRaw(editorInstance.value).dispose();

// 创建编辑器实例
onMounted(() => {
  loader.init().then((monaco) => {
    editorInstance.value = monaco.editor.create(editorContainer.value, {
      value: showContent.value,
      language: 'sql',
      theme: 'vs-dark'
      // automaticLayout: true // 窗口resize时自适应
      // readOnly: true // 是否设置为只读模式
    })

    // 监听滚动事件
    // editorInstance.value.onDidScrollChange(
    //   throttle((e) => {
    //     // 获取编辑器的配置选项
    //     const options = editorInstance.value.getOptions()
    //     // 获取行高
    //     let lineHeight = options.get(monaco.editor.EditorOption.lineHeight)
    //     const layoutInfo = editorInstance.value.getLayoutInfo()
    //     const scrollTop = e.scrollTop // 当前滚动位置
    //     const visibleHeight = layoutInfo.height // 可见区域的高度

    //     const model = editorInstance.value.getModel()
    //     const lineCount = model.getLineCount() // 总行数

    //     // 判断是否滑到底部
    //     if (scrollTop >= lineCount * lineHeight - visibleHeight) {
    //       console.log('滚动条滑到底部了！')
    //       // emit('load-more') // 发出 load-more 事件
    //     }
    //   }, 1000)
    // ) // 1000ms 的节流间隔
  })
})

// 组件卸载时销毁实例
onBeforeUnmount(() => {
  if (editorInstance.value) {
    toRaw(editorInstance.value).dispose()
  }
})

// 定义一个格式化代码的方法
const formatCode = async () => {
  if (editorInstance.value) {
    const formattedCode = await prettier.format(toRaw(editorInstance.value).getValue(), {
      language: 'hive',
      keywordCase: 'upper',
      expressionWidth: 150,
      parser: 'sql',
      plugins: [prettierSql],
      newlineBeforeSemicolon: true,
      database: 'hive',
      identifierCase: 'lower',
      functionCase: 'upper',
      logicalOperatorNewline: 'before'
      // formatter: 'node-sql-parser'
    })

    toRaw(editorInstance.value).setValue(formattedCode)
  }
}

const pos = ref(0)

function handleClick() {
  formatCode()
}

// 节流函数
function throttle(func, wait) {
  let lastTime = 0
  return function (...args) {
    const now = Date.now()
    if (now - lastTime >= wait) {
      lastTime = now
      func.apply(this, args)
    }
  }
}

// 监听 value 变化，加载新的文本内容
watch(showContent, (newValue) => {
  console.log('value changed:', newValue.length)
  if (editorInstance.value) {
    const oldValue = toRaw(editorInstance.value).getValue() // 获取编辑器内容
    toRaw(editorInstance.value).setValue(oldValue + newValue) // 更新编辑器内容
  }
})
</script>

<style></style>
